package com.testing.sunnycommon.quartz;

import com.testing.sunnycommon.model.SunnyQuartzTask;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Classname SunnyQuartzTaskManager
 * @Description 类型说明
 * @Date 2023/6/21 11:34
 * @Created by 特斯汀Roy
 */
@Component
public class SunnyQuartzTaskManager {
    @Autowired
    private Scheduler scheduler;

    /**
     * 完成定时任务的执行信息配置
     * @param sunnyQuartzTask
     * @return
     */
    private JobDetail buildJobDetail(SunnyQuartzTask sunnyQuartzTask) {
        //创建jobDataMap,让job类能够获取到相应的projectId数据来完成runservice的调用
        JobDataMap jobDataMap = new JobDataMap();
        //将projectId传进去，之后在job类中获取并调用
        jobDataMap.put("projectId", sunnyQuartzTask.getProjectId());
        System.out.println(sunnyQuartzTask);

        //创建的时候用到的类型是实现了Job的自定义类
        return JobBuilder.newJob(SunnyRunQuartzJob.class)
                //用task实体的id作为定时任务的唯一标识
                .withIdentity(sunnyQuartzTask.getId().toString())
                //描述信息
                .withDescription(sunnyQuartzTask.getTaskDescription())
                //使用创建好的jobDataMap来完成projectId的传递
                .usingJobData(jobDataMap)
                .storeDurably()
                .build();
    }

    /**
     * 定义触发器，确定任务什么时候执行
     * @param sunnyQuartzTask
     * @return
     */
    private Trigger buildTrigger(SunnyQuartzTask sunnyQuartzTask) {
        return TriggerBuilder.newTrigger()
                //唯一标识，基于id拼接一个_trigger作为触发器的表示
                .withIdentity(sunnyQuartzTask.getId() + "_trigger")
                //周期执行频率，cron表达式，其实就是个字符串，构建出触发日程
                .withSchedule(CronScheduleBuilder.cronSchedule(sunnyQuartzTask.getCronExpression()))
                .build();
    }

    /**
     * 添加并且启动任务
     *
     * @param sunnyQuartzTask
     * @throws SchedulerException
     */
    public void activeQuartzTask(SunnyQuartzTask sunnyQuartzTask) throws SchedulerException {
        //调用封装好的方法，生成job以及触发器
        JobDetail jobDetail = buildJobDetail(sunnyQuartzTask);
        Trigger trigger = buildTrigger(sunnyQuartzTask);
        //将job和触发器配置到日程表里，真正完成定时任务的配置启动
        scheduler.scheduleJob(jobDetail, trigger);
    }

    /**
     * 停止任务，基于任务触发名停止
     *
     * @param sunnyQuartzTask
     * @throws SchedulerException
     */
    public void unActiveQuartzTask(SunnyQuartzTask sunnyQuartzTask) throws SchedulerException {
        //定义触发器的名字，以查找对应的触发器
        TriggerKey triggerKey = TriggerKey.triggerKey(sunnyQuartzTask.getId() + "_trigger");
        //通过触发器名字，停用触发器和job
        scheduler.unscheduleJob(triggerKey);
    }


    /**
     * 删除任务，删除的时候停止任务，然后基于任务键进行删除
     *
     * @param sunnyQuartzTask
     * @throws SchedulerException
     */
    public void deleteQuartzTask(SunnyQuartzTask sunnyQuartzTask) throws SchedulerException {
        //停用触发器
        unActiveQuartzTask(sunnyQuartzTask);
        //删除job
        scheduler.deleteJob(JobKey.jobKey(sunnyQuartzTask.getId().toString()));
    }


}
